package com.linchong.concurrency.sync;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author linchong
 * @version 1.0
 * @Date: 2020-12-08 15:58
 * @Description: SynchronizedExample1$
 */
@Slf4j
public class SynchronizedExample1 {

	/**
	 * 修饰代码块
	 */
	public void test1(int j){
		synchronized (this){
			for (int i = 0; i < 100; i++) {
				log.info("test1 - {} - {}",j,i);
			}
		}
	}

	/**
	 * 修饰一个方法
	 * 如果SynchronizedExample1是一个父类，子类在继承它时，
	 * 调用test2是不包含synchronized的，
	 * 因为synchronized不属于方法声明的一部分，如果子类也需要使用synchronized的话，
	 * 它需要显示的在方法前声明synchronized
	 */
	public synchronized void test2(int j){
		for (int i = 0; i < 100; i++) {
			log.info("test2 {} - {}",j,i);
		}
	}

	public static void main(String[] args) {
		SynchronizedExample1 instance = new SynchronizedExample1();
		SynchronizedExample1 instance2 = new SynchronizedExample1();
		ExecutorService executorService = Executors.newCachedThreadPool();

		//一个对象的两个进程同时调用一个方法
		//线程池，两次调用模拟同一个调用对象，同时来调用这个方法，即同步代码块执行情况
//		executorService.execute(instance::test2);
//		executorService.execute(instance::test2);
		executorService.execute(()->instance.test1(1));
		executorService.execute(()->instance2.test1(2));

	}
}








